package com.zxy.zxyrpc.server.tcp;

import com.zxy.zxyrpc.protocol.ProtocolConstant;
import io.vertx.core.Handler;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.parsetools.RecordParser;

/**
 * Tcp 缓存处理器（装饰器模式，对原有的Buffer进行增强）
 *
 * @author zxy
 * @since 2025/5/25
 **/
public class TcpBufferHandleWrapper implements Handler<Buffer> {
    private final RecordParser recordParser;

    public TcpBufferHandleWrapper(Handler<Buffer> bufferHandler) {
        recordParser = initRecordParser(bufferHandler);
    }

    @Override
    public void handle(Buffer buffer) {
        recordParser.handle(buffer);
    }

    private RecordParser initRecordParser(Handler<Buffer> bufferHandler) {
        // 构造 parser
        RecordParser parser = RecordParser.newFixed(ProtocolConstant.MESSAGE_HEADER_LEN);
        parser.setOutput(new Handler<Buffer>() {
            // 消息体长度
            int size = -1;
            // 完整数据（头+体）
            Buffer resultBuffer = Buffer.buffer();

            @Override
            public void handle(Buffer buffer) {
                if (-1 == size) {
                    size = buffer.getInt(13);
                    parser.fixedSizeMode(size);
                    // 写入头信息
                    resultBuffer.appendBuffer(buffer);
                } else {
                    // 写入体信息
                    resultBuffer.appendBuffer(buffer);
                    // 已拼接为完整 Buffer，执行处理
                    bufferHandler.handle(resultBuffer);
                    // 重置数据
                    parser.fixedSizeMode(ProtocolConstant.MESSAGE_HEADER_LEN);
                    size = -1;
                    resultBuffer = Buffer.buffer();
                }
            }
        });
        return parser;
    }
}

